package com.example.myapplication.DesignPatterns.singletop;


/**
 * 饿汉式  静态常量 -- 可用
 * 优点：简单；在类装载的时候就完成实例化；避免了线程同步问题
 * 缺点：在类装载的时候就完成实例化，
 * 没有达到Lazy Loading的效果。
 * 如果从始至终从未使用过这个实例，则会造成内存的浪费
 */
class Singleton1 {

    private final static Singleton1 INSTANCE = new Singleton1();
    private Singleton1() {}
    public static Singleton1 getInstance() {
        return INSTANCE;
    }
}
/**
 * 饿汉式 静态代码块 -- 可用
 * 分析：同上面的方式类似，这里将类实例化的过程放在了静态代码块中，
 * 也是在类装载的时候，就执行静态代码块中的代码，初始化类的实例；所以优缺点基本相同
 */
class Singleton2 {

    private static Singleton2 instance;
    static {
        instance = new Singleton2();
    }
    private Singleton2() {}

    public static Singleton2 getInstance() {
        return instance;
    }
}

/**
 * 静态内部类 -- 推荐使用
 * 优点：避免了线程不安全，延迟加载，效率高
 */
public class SingleTon {
    public static SingleTon singleTon;

    public SingleTon() {
    }

    public static SingleTon init(){
        if(singleTon == null){
            synchronized (SingleTon.class){
                if(singleTon == null){
                    singleTon = new SingleTon();
                }
            }
        }
        return singleTon;
    }
}
